import Vue from 'vue'
import App from './App.vue'
import router from './router'
import axios from 'axios'
import filter from './filter/filter'
import Global from '../public/static/js/global'

Vue.config.productionTip = false;
Vue.prototype.$ajax = axios;
Vue.prototype.Global = Global;

// 示例：main.js内也可以直接定义全局函数，其他vue页面直接this引用即可。
// Vue.prototype.routerAuth = function(router) {
//   let resources = Tool.getLoginUser().resources;
//   if (Tool.isEmpty(resources)) {
//     return false;
//   }
//   for (let i = 0; i < resources.length; i++) {
//     if (router === resources[i].page) {
//       return true;
//     }
//   }
//   return false;
// };

/**
 * 前后端分离会有一个问题，每次ajax请求，后端tomcat的session是不一样的,
 * 这种情况在正常的springboot项目不会出现的，
 * 比如前端为springboot+html+JQuery.js，springboot+FreeMarker.ftl，springboot+thymeleaf
 * 或者springboot+jsp都不会出来这种问题。
 * 这种情况一般会在springboot+vue前端框架和springboot+AngularJS前端框架上面出现
 */
// 解决每次ajax请求，对应的sessionId不一致的问题
// 后面因为使用redis共享session，不再使用tomcat的session，所以注释这句代码。
// axios.defaults.withCredentials = true;

/**
 * axios拦截器
 */
axios.interceptors.request.use(function (config) {
  console.log("请求：", config);
  let loginUser = Tool.getLoginUser();
  //如果loginUser缓存不为空，则获取token的值
  let token = Tool.isNotEmpty(loginUser) ? loginUser.token : null;
  if (Tool.isNotEmpty(token)) {
    //这种方法可以给请求头增加统一的系统参数，比如在headers增加请求流水号和时间等等。
    //headers是请求头，它的属性是可以算定义，这里定义了token属性，并赋值。
    //可以在浏览器调试窗口的请求头中查看刚刚增加的token属性。
    //后端获取请求头中的token时，需要用到属性名才能获取。
    config.headers.token = token;
    console.log("请求headers增加token:", config.headers.token);
  }
  return config;
}, error => {});
axios.interceptors.response.use(function (response) {
  console.log("返回结果：", response);
  response.headers.prince = "嘉文四世";
  console.log("尝试给响应头增加自定义prince属性：", response.headers.prince);
  return response;
}, error => {
  console.log("返回拦截：", error.response);
  let response = error.response;
  const status = response.status;
  if (status === 408) {
    // 判断状态码是401 跳转到登录
    console.log("未登录，跳到登录页面");
    Tool.setLoginUser(null);
    router.push('/login');
    return {
      data: {
        success: false,
        message: "请重新登录"
      }
    };
  }else if (status === 408) {
    return {
      data: {
        success: false,
        message: "没有权限"
      }
    };
  }

});

// 全局过滤器
Object.keys(filter).forEach(key => {
  Vue.filter(key, filter[key])
});

// 路由登录拦截
router.beforeEach((to, from, next) => {
  // 要不要对meta.loginRequire属性做监控拦截
  if (to.matched.some(function (item) {
    //该属性在router.js中配置，打开router.js文件按ctrl+F搜索loginRequire使用示例
    return item.meta.loginRequire
  })) {
    let loginUser = Tool.getLoginUser();
    if (Tool.isEmpty(loginUser)) {
      next('/login');
    } else {
      next();
    }
  } else {
    next();
  }
});

new Vue({
  router,
  render: h => h(App),
}).$mount('#app');

console.log("环境：", process.env.NODE_ENV);
console.log("地址：", process.env.VUE_APP_SERVER);
